package com.yuanluludev.lib_x5web

import android.content.Context
import com.tencent.smtt.export.external.TbsCoreSettings
import com.tencent.smtt.sdk.QbSdk
import com.tencent.smtt.sdk.TbsListener
import com.yuanluludev.lib_base.application.BaseApplication
import com.yuanluludev.lib_base.utils.MMKVUtils
import com.yuanluludev.lib_utils.util.LogUtils

/**
 * x5 web init
 */
object X5WebInit {

    private var IS_INIT_COMPLETED: String = "is_x5_web_init_completed"

    fun init(appContext: Context?) {
        if (appContext == null) {
            throw NullPointerException("init x5 web app context can not null")
        }

        //没有重新 下载  就清除状态 重新下载
        if (!MMKVUtils.getInstance().decodeBoolean(IS_INIT_COMPLETED)) {
            QbSdk.reset(appContext)
        }

        // 在调用TBS初始化、创建WebView之前进行如下配置
        val map = HashMap<String, Any>()
        map[TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER] = true
        map[TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE] = true
        QbSdk.initTbsSettings(map)

        //为了提高内核占比，在初始化前可配置允许移动网络下载内核（大小 40-50 MB）。默认移动网络不下载
        QbSdk.setDownloadWithoutWifi(true)

        //SDK内核初始化周期回调，包括 下载、安装、加载
        QbSdk.setTbsListener(object : TbsListener {
            /**
             * @param stateCode 用户可处理错误码请参考[com.tencent.smtt.sdk.TbsCommonCode]
             */
            override fun onDownloadFinish(stateCode: Int) {
                LogUtils.d("X5WebInit", "onDownloadFinished: $stateCode")
                // 100 代表下载完成
            }

            /**
             * @param stateCode 用户可处理错误码请参考[com.tencent.smtt.sdk.TbsCommonCode]
             */
            override fun onInstallFinish(stateCode: Int) {
                //200 代表安装成功
                if (stateCode == 200) {
                    MMKVUtils.getInstance().encode(IS_INIT_COMPLETED, true)
                }
                LogUtils.d("X5WebInit", "onInstallFinished: $stateCode")
            }

            /**
             * 首次安装应用，会触发内核下载，此时会有内核下载的进度回调。
             * @param progress 0 - 100
             */
            override fun onDownloadProgress(progress: Int) {
                LogUtils.d("X5WebInit", "Core Downloading: $progress")
            }
        })

        //初始化SDK环境，在App启动后尽可能早地调用初始化接口，进行内核预加载
        QbSdk.initX5Environment(appContext, object : QbSdk.PreInitCallback {
            // 内核初始化完成，
            override fun onCoreInitFinished() {
                LogUtils.d("X5WebInit", "----------- 内核初始化完成 -----------------")
            }

            /**
             * 预初始化结束
             * 由于X5内核体积较大，需要依赖网络动态下发，所以当内核不存在的时候，默认会回调false，此时将会使用系统内核代替
             * @param isX5 是否使用X5内核
             */
            override fun onViewInitFinished(isX5: Boolean) {
                LogUtils.d("X5WebInit", "----------- 内核初始化完成 ------------是否使用的X5内核 = ${isX5}--- --")
            }
        })

        // 只进行本地内核的预加载、不做版本检测及内核下载
//        QbSdk.preInit(appContext, object : PreInitCallback {
//            override fun onCoreInitFinished() {
//                LogUtils.e("----------- 预加载完成 -----------------")
//            }
//
//            override fun onViewInitFinished(isX5: Boolean) {
//                LogUtils.e("----------- 预加载完成 ------------是否使用的X5内核 = ${isX5}--- --")
//            }
//        })

    }

    /**
     * 判断x5 web是否下载并且加载成功了
     */
    fun x5WebInitSuccess(): Boolean {
        return QbSdk.getTbsVersion(BaseApplication.getThisApplication()) != 0
    }

}